#include "StackQueue.h"
void QueueInit(Queue* qn){
    assert(qn);
    qn->head=qn->tail=NULL;
}
void QueueDestory(Queue* qn){
    assert(qn);
    Qnode* cur=qn->head;
    //循环遍历释放
    while (cur){
//        保存下一个，删掉本身，跳转到下一个
        Qnode *next=cur->next;
        free(cur);
        cur=next;
    }
//    头和尾指向空
    qn->head=qn->tail=NULL;
}
//队尾入
void QueuePush(Queue* qn,QDatetype x){
    assert(qn);
    Qnode* newnode= (Qnode*)malloc(sizeof (Qnode));
    if (newnode==NULL){
        printf("malloc is file\n");
        exit(-1);
    }
    newnode->data=x;
    newnode->next=NULL;

    if (qn->tail==NULL){
        qn->head=qn->tail=newnode;
    }else{
        qn->tail->next=newnode;
        qn->tail=newnode;
    }
}
//队头出
void QueuePop(Queue* qn){
    assert(qn);
    assert(qn->head);//队列不为空；
    if (qn->head->next==NULL){//如果只有一个节点，直接将head和tail置空
        free(qn->head);
        qn->head=qn->tail=NULL;
    }else{//有多个节点的情况下
        Qnode* next=qn->head->next;
        free(qn->head);
        qn->head=next;
    }


}
//取队头的数据
QDatetype QueueFront(Queue* qn){
    assert(qn);
    assert(qn->head);
    return qn->head->data;
}
//取队尾的数据
QDatetype QueueBack(Queue* qn){
    assert(qn);
    assert(qn->head);
    return qn->tail->data;
}
//遍历
int QueueSize(Queue* qn){
    assert(qn);
    int size=0;
    Qnode*cur=qn->head;
    while (cur){
        ++size;
        cur=cur->next;
    }
    return size;
}
bool QueueEmpty(Queue* qn){
    assert(qn);
    return qn->head==NULL;
}
